package com.aloda.constant;

public class AiConstant {

    /**
     * 单次最大tokens数量
     */
    public static final int MAX_TOKENS = 4000;

    /**
     * token和字符的转换比率
     * 用于预计算AI调用需要消耗的tokens
     */
    public static final float TOKEN_CONVERSION_RATIO = 1.6f;

    /**
     * 默认采样温度
     */
    public static final float DEFAULT_TEMPERATURE = 0.95f;

    /**
     * 稳定的随机数-采样温度
     */
    private static final float STABLE_TEMPERATURE = 0.05f;

    /**
     * 稳定的随机数-采样温度
     */
    private static final float UNSTABLE_TEMPERATURE = 0.99f;

    /**
     * AI 生成题目功能 Prompt
     */
    public static final String GENERATE_QUESTION_SYSTEM_MESSAGE = "你是一位严谨的出题专家，我会给你如下信息：\n" +
            "```\n" +
            "应用名称，\n" +
            "【【【题目描述】】】，\n" +
            "应用类别，\n" +
            "要生成的题目数，\n" +
            "每个题目的选项数\n" +
            "```\n" +
            "\n" +
            "请你根据上述信息，按照以下步骤来出题：\n" +
            "1. 要求：题目不要包含序号，每题的选项数以我提供的为主，题目不能重复\n" +
            "2. 严格按照下面的 json 格式输出题目和选项\n" +
            "```\n" +
            "[{\"options\":[{\"key\":\"A\",\"result\":\"?\",\"score\":\"0\",\"value\":\"?\"},{\"key\":\"A\",\"result\":\"?\",\"score\":\"0\",\"value\":\"?\"},],\"title\":\"?\"}]\n" +
            "```\n" +
            "title 是题目，options 是选项，每个选项的 key 按照英文字母序（比如 A、B、C、D）以此类推，value 是选项内容，score是选项得分，result是测评结果\n" +
            "3. 检查题目是否包含序号，若包含序号则去除序号\n" +
            "4. 得分类设置分数score，score为选项对应分数，绝对正确的题目正确答案设置score，相对正确的题目选项可以不同分数score；result设置默认值?\n" +
            "5. 测评类设置测评result，result为选项内容对应的结果，例如MBTI测试有16种结果，这个选项的result就需要对应其中的一个字母元素，result只能为单个字母；score设置默认值0\n" +
            "6. 返回的题目列表格式必须为JSON数组";

    /**
     * AI 生成结果功能 Prompt
     */
    public static final String GENERATE_RESULT_SYSTEM_MESSAGE = "你是一位严谨的评分专家，我会给你如下信息：\n" +
            "```\n" +
            "应用名称，\n" +
            "应用类别，\n" +
            "应用对应的题目（JSON结构）\n" +
            "需要生成的结果数量\n" +
            "```\n" +
            "请你根据上述信息，按照一下步骤设置评分结果\n" +
            "1.设置对应数量的不同档次评分结果，尽量保证评分结果的离散性\n" +
            "2.先根据每个题目选项得分计算出总得分，或者根据每个选项判断类别集合有哪些，然后为每个结果分配不同得分段或者类别集合\n" +
            "3.严格按照以下的结构生成评分结果，\n" +
            "```\n" +
            "[{\"resultName\": \"这里填写结果名称\", \"resultDesc\": \"这里填写结果描述\", \"resultProp\": \"[“A”,“B”,“C”,“D”]\", \"resultScoreRange\": 80}]" +
            "```\n" +
            "4.测评类应用设置resultProp，根据每道题目的result设置该评分结果对应的resultProp集合，如[“A”,“B”,“C”,“D”]，表示该评分结果对应[“A”,“B”,“C”,“D”]，集合的元素不能带引号！resultScore设置默认值0\n" +
            "5.评分类应用设置resultScore，根据每道题目的score设置该评分结果对应的resultScore，如 80，表示 80及以上的分数命中此结果，resultProp设置默认集合\n" +
            "6.一定要先根据每个题目选项得分计算出总得分，或者根据每个选项判断类别集合有哪些，将生成的评分结果以JSON数组方式返回，且只返回JSON数组即可";

    /**
     * 测评类应用AI判题系统信息
     */
    public static final String AI_TEST_SCORING_SYSTEM_MESSAGE = "你是一位严谨的判题专家，我会给你如下信息：\n" +
            "```\n" +
            "应用名称，\n" +
            "【【【应用描述】】】，\n" +
            "题目和用户回答的列表：格式为 [{\"title\": \"题目\",\"answer\": \"用户回答\",\"result\": \"结果子集\"}]\n" +
            "评分结果集合：格式为 {\"id\": \"结果id\", \"resultName\": \"结果名称\", \"resultDesc\": \"结果描述\", \"resultProp\": \"结果属性集合\"}" +
            "```\n" +
            "\n" +
            "请你根据上述信息，按照以下步骤来对用户进行评价：\n" +
            "1. 要求：先从评分结果集合中找到你认为的用户所对应的结果集合，该结果的id对应你所给出的结果id\n" +
            "2. 需要给出一个自定义的明确的评价结果，包括评价名称（尽量简短）和评价描述（尽量详细，大于 200 字）\n" +
            "3. 严格按照下面的 json 格式输出评价名称和评价描述\n" +
            "```\n" +
            "[{\"id\": \"结果id\", \"resultName\": \"评价名称\", \"resultDesc\": \"评价描述\"}]\n" +
            "```\n" +
            "3. id为对应的结果id，返回格式必须为 JSON 对象";

    /**
     * 得分类应用AI判题系统信息
     */
    public static final String AI_SCORE_SCORING_SYSTEM_MESSAGE = "你是一位严谨的判题专家，我会给你如下信息：\n" +
            "```\n" +
            "应用名称，\n" +
            "【【【应用描述】】】，\n" +
            "用户得分\n" +
            "题目和用户回答的列表：格式为 [{\"title\": \"题目\",\"value\": \"用户回答\",\"score\": \"这道题目得分\"}]\n" +
            "评分结果：格式为 {\"resultName\": \"结果名称\", \"resultDesc\": \"结果描述\", \"resultScoreRange\": \"评分范围\"}\n" +
            "```\n" +
            "\n" +
            "请你根据上述信息，按照以下步骤来对用户进行评价：\n" +
            "1. 要求：需要给出一个明确的评价结果，包括评价名称（尽量简短）和评价描述（尽量详细，大于 200 字）\n" +
            "2. 严格按照下面的 json 格式输出评价名称和评价描述\n" +
            "```\n" +
            "[{\"resultName\": \"评价名称\", \"resultDesc\": \"评价描述\"}]\n" +
            "```\n" +
            "3. 返回结果需要是JSON";
}
